package main

import "fmt"

func main() {
	/**
		定义切片：
		   1. var s1 []int
		   2. s1 := []int{1,2,3}
	       3. s1 := make([]int,3)

	    切片原理：
	       1. 每一个切片引用了一个底层数组
	       2. 切片本身不存储任何数据，都是这个底层数组存储，所以修改切片也就是修改这个数组中的数据
	       3. 当向切片中添加数据时，如果没有超过容量，直接添加，如果超过容量，自动扩容
	       4. 切片一旦扩容，就是重新指向一个新的底层数组
	       5. 切片是引用类型的数据，存储了底层数组的引用
	*/
	var s []int
	fmt.Println(s)
	fmt.Println(s == nil)

	s3 := make([]int, 2, 4)
	s3 = append(s3, 1)
	s3 = append(s3, 1)
	s3 = append(s3, 1)
	s = append(s3, 1)
	fmt.Println(len(s3))
	fmt.Println(cap(s3))
	fmt.Println(s3)
	fmt.Println(s)

	/*
			在已有的数组上，直接创建切片，该切片的底层数组就是当前的数组。 该操作有危险，如果有多个变量操作同一个数组，那么很可能会造成数据紊乱，因为都是操作的同一个底层数组。
		     slice := arr[start : end ]，切片中的数据[start, end]
		     arr[:end] 从头到end
		     arr[start:] 从start到末尾
	*/

	/*
				深拷贝和浅拷贝：
				 1.深拷贝：拷贝的是数据本身
				           值类型的数据，默认都是深拷贝: array,int,float,string,bool,struct

			     2. 浅拷贝：拷贝的是数据地址
		            导致多个变量指向同一块内存，引用类型的数据默认都是浅拷贝，slice和map
	*/

	// 深拷贝方法copy相当于java中的system.array
	//copy(dst,src []type),如何只复制一部分copy(dst[2:],src[1:])

	//删除切片元素
	a := []string{"1", "2", "3", "4", "5"}
	a = append(a[0:1], a[2:]...)
	fmt.Println(a)
}
